package de.fhin.mas.agents.navigator.behaviours;

import jade.core.Agent;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.FailureException;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.lang.acl.ACLMessage;
import jade.proto.ContractNetResponder;
import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.navigator.NavigatorAgent;
import de.fhin.mas.util.MessageUtil;

/**
 * 
 * @author Matthias Wilhelm
 * 
 */
public class ResumeCFPHandler extends ContractNetResponder {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6510649244100729311L;

	public ResumeCFPHandler(Agent agent) {
		super(agent, MessageUtil.buildBasicCommunicationTemplate(
				FIPANames.InteractionProtocol.FIPA_CONTRACT_NET,
				MASEvents.RESUME.getName(), ACLMessage.CFP, null));
	}

	/**
	 * Wird eine CFP Nachricht empfangen, so wird diese Methode aufgerufen
	 * 
	 * @param cfp
	 *            Referenz auf die empfangene CFP NAachricht
	 */
	@Override
	protected ACLMessage handleCfp(ACLMessage cfp) throws RefuseException,
			FailureException, NotUnderstoodException {
		// Antwort erstellen
		ACLMessage response = cfp.createReply();
		response.setPerformative(ACLMessage.PROPOSE);
		// TODO: Text hinzufügen?
		System.out.println("PROPOSE sent");
		return response;

	}

	/**
	 * Wird eine ACCEPT_PROPOSAL Nachricht empfangen, so wird diese Methode
	 * aufgerufen
	 * 
	 * @param cfp
	 *            Eine Referenz auf die CFP Nachricht für die das
	 *            ACCEPT_PROPOSAL gilt
	 * @param propose
	 *            Referenz auf die PROPOSE Nachricht für die CFP Nachricht
	 * @param accept
	 *            Referenz auf die ACCEPT Nachricht für die PROPOSE Nachricht
	 */
	@Override
	protected ACLMessage handleAcceptProposal(ACLMessage cfp,
			ACLMessage propose, ACLMessage accept) throws FailureException {
		// Eine Antwort auf die ACCEPT_PROPOSAL Nachricht erstellen
		ACLMessage response = accept.createReply();
		response.setPerformative(ACLMessage.INFORM);
		response.setContent("DONE");

		((NavigatorAgent) myAgent).resume();
		return response;
	}

	/**
	 * Wird aufgerufen, falls eine REJECT_PROPOSAL Nachricht eintrifft.
	 * 
	 * @param cfp
	 *            CFP Nachricht für die REJECT_PROPOSAL Nachricht
	 * @param propose
	 *            PROPOSE Nachricht welche für die CFP Nachricht versandt wurde
	 * @param reject
	 *            Die eigentliche REJECT_PROPOSAL Nachricht
	 */
	@Override
	protected void handleRejectProposal(ACLMessage cfp, ACLMessage propose,
			ACLMessage reject) {
		// TODO: zustand nicht ändern
		((NavigatorAgent) myAgent).println(reject.getSender().getName()
				+ " sent a REJECT_PROPOSAL.");
	}
}
